package com.shortLinked.admin.remote;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shortLinked.admin.common.config.OpenFeignConfiguration;
import com.shortLinked.admin.common.convention.result.Result;
import com.shortLinked.admin.remote.dto.req.*;
import com.shortLinked.admin.remote.dto.resp.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * 短链接中控远程调用 - OpenFeign版本
 */
@FeignClient(
        value = "short-link-project",
        url = "${aggregation.remote-url:}",
        configuration = OpenFeignConfiguration.class
)
public interface ShortLinkActualRemoteService {
    /**
     * 创建短链接 - 远程调用
     *
     * @param requestParam 创建短链接请求参数
     * @return 短链接返回响应
     */
    @PostMapping("/api/short-link/project/v1/create")
    Result<ShortLinkCreateRespDTO> createShortLink(@RequestBody ShortLinkCreateReqDTO requestParam);

    /**
     * 批量创建短链接 - 远程调用
     *
     * @param requestParam 批量创建短链接请求入参
     * @return 批量短链接基本信息
     */
    @PostMapping("/api/short-link/project/v1/create/batch")
    Result<ShortLinkBatchCreateRespDTO> batchCreateShortLink(@RequestBody ShortLinkBatchCreateReqDTO requestParam);

    /**
     * 修改短链接信息
     *
     * @param requestParam 短链接修改参数实体
     */
    @PostMapping("/api/short-link/project/v1/update")
    void updateShortLink(@RequestBody ShortLinkUpdateReqDTO requestParam);

    /**
     * 短链接分页查询
     *
     * @param gid      短链接分组标识
     * @param orderTag 分页排序标识
     * @param current  当前页
     * @param size     当前页的数量
     * @return 短链接分页返回实体
     */
    @GetMapping("/api/short-link/project/v1/page")
    Result<Page<ShortLinkPageRespDTO>> pageShortlink(@RequestParam("gid") String gid,
                                                     @RequestParam("orderTag") String orderTag,
                                                     @RequestParam("current") Long current,
                                                     @RequestParam("size") Long size);

    /**
     * 短链接分组内查询个数
     *
     * @param requestParam 分组标识 list
     * @return 分组信息返回参数
     */
    @GetMapping("/api/short-link/project/v1/count")
    Result<List<ShortLinkGroupCountQueryRespDTO>> listShortLinkGroupQueryCount(@RequestParam("requestParam") List<String> requestParam);

    /**
     * 通过 url 获取网站标题
     *
     * @param url 网站 url
     * @return 网站标题
     */
    @GetMapping("/api/short-link/project/v1/title")
    Result<String> getTitleByUrl(@RequestParam("url") String url);

    /**
     * 短链接回收站保存功能
     *
     * @param requestParam 短链接回收站请求参数
     */
    @PostMapping("/api/short-link/recycle-bin/project/v1/save")
    void saveRecycleBin(@RequestBody RecycleBinReqDTO requestParam);

    /**
     * 短链接回收站分页查询
     *
     * @param gidList 用户短链接分组标识 list
     * @param current 当前页
     * @param size    当前页个数
     * @return 短链接回收站分页返回实体
     */
    @GetMapping("/api/short-link/recycle-bin/project/v1/page")
    Result<Page<ShortLinkPageRespDTO>> pageRecycleBinShortlink(
            @RequestParam("gidList") List<String> gidList,
            @RequestParam("current") Long current,
            @RequestParam("size") Long size);

    /**
     * 回收站短链接恢复功能
     *
     * @param requestParam 恢复请求参数
     */
    @PostMapping("/api/short-link/recycle-bin/project/v1/recover")
    void recoverRecycleBin(@RequestBody RecoverRecycleBinReqDTO requestParam);

    /**
     * 回收站短链接移除功能
     *
     * @param requestParam 移除请求参数
     */
    @PostMapping("/api/short-link/recycle-bin/project/v1/remove")
    void removeRecycleBin(@RequestBody RemoveRecycleBinReqDTO requestParam);

    /**
     * 单个短链接一段时间内访问详情
     *
     * @return 访问统计详情
     */
    @GetMapping("/api/short-link/project/v1/stats")
    Result<ShortLinkStatsRespDTO> oneShortLinkStats(
            @RequestParam("gid") String gid,
            @RequestParam("fullShortUrl") String fullShortUrl,
            @RequestParam("startDate") String startDate,
            @RequestParam("endDate") String endDate,
            @RequestParam("enableStatus") Integer enableStatus);

    /**
     * 远程调用 - 指定分组短链接指定时间内监控数据
     *
     * @return 分组短链接指定日期统计详情
     */
    @GetMapping("/api/short-link/project/v1/stats/group")
    Result<ShortLinkStatsRespDTO> groupShortLinkStats(
            @RequestParam("gid") String gid,
            @RequestParam("startDate") String startDate,
            @RequestParam("endDate") String endDate);


    /**
     * 远程调用 - 单个短链接指定时间内访问日志详情
     *
     * @return 单个短链接访问日志分页详情
     */
    @GetMapping("/api/short-link/project/v1/access-record")
    Result<Page<ShortLinkStatsAccessRecordRespDTO>> shortLinkStatsAccessRecord(
            @RequestParam("gid") String gid,
            @RequestParam("fullShortUrl") String fullShortUrl,
            @RequestParam("startDate") String startDate,
            @RequestParam("endDate") String endDate,
            @RequestParam("enableStatus") Integer enableStatus,
            @RequestParam("current") Long current,
            @RequestParam("size") Long size);

    /**
     * 远程调用 - 指定分组短链接指定时间内访问记录监控数据
     *
     * @return 分组短链接指定日期访问记录统计详情
     */
    @GetMapping("/api/short-link/project/v1/access-record/group")
    Result<Page<ShortLinkStatsAccessRecordRespDTO>> groupShortLinkStatsAccessRecord(
            @RequestParam("gid") String gid,
            @RequestParam("startDate") String startDate,
            @RequestParam("endDate") String endDate,
            @RequestParam("current") Long current,
            @RequestParam("size") Long size);
}
